package day15;

/**
 * @author aiPlusPlus
 * @version 1.0
 * @date 2022/12/15 14:56
 */

/**
 * 给你一个 n x n 矩阵 matrix ，其中每行和每列元素均按升序排序，找到矩阵中第 k 小的元素。
 * 请注意，它是 排序后 的第 k 小元素，而不是第 k 个 不同 的元素。
 *
 * 你必须找到一个内存复杂度优于 O(n2) 的解决方案。
 *
 *
 *
 * 示例 1：
 *
 * 输入：matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8
 * 输出：13
 * 解释：矩阵中的元素为 [1,5,9,10,11,12,13,13,15]，第 8 小元素是 13
 * 示例 2：
 *
 * 输入：matrix = [[-5]], k = 1
 * 输出：-5
 */
public class Solution2 {
    public int kthSmallest(int[][] matrix, int k) {
        int n = matrix.length;
        int left = matrix[0][0];
        int right = matrix[n-1][n-1];
        while (left<right){
            int mid = (right-left)/2 + left;
            if (check(matrix, mid, k, n)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
    private boolean check(int[][] matrix, int mid, int k, int n) {
        int i = n-1;
        int j = 0;
        int num = 0;
        while (i>=0&&j<n){
            if(matrix[i][j]<=mid){
                num+=i+1;
                j++;
            }else {
                i--;
            }
        }
        return num>=k;
    }
}
